<?php
/**
 * Глобальный класс управления интернет-магазином
 * 
 * @category Phorm
 * @package Store
 * @name /Phorm/Store.php
 * @copyright phorm.ru
 * @since 18.07.2012
 * @author vladimir@kachalov.net
 */

class Phorm_Store extends Phorm_Model {
	
	/**
	 * Возвращает список способов доставки
	 *
	 * @param array $options Массив опций
	 * @return array
	 */
	
	public function getDeliveryList($options = array()) {
				
		$select = $this->_db->select()
				-> from(array('AA'=>'pw_store_delivery'), 
							new Zend_Db_Expr("SQL_CALC_FOUND_ROWS AA.*, 1 actions"))
				-> where('isexist=?','yes');
				
		// Сортировки
		if(isset($options['sortField']) && in_array($options['sortField'],$this->getTableCols('pw_store_delivery'))) {
			$sortOrder = isset($options['sortOrder']) && $options['sortOrder']=='desc' ? ' DESC' : ' ASC';
			$select->order($options['sortField'].$sortOrder);
		} else {
			$select -> order('IF(sortorder=0,999999999,sortorder)')
					-> order ('deliveryid');
		}
		
		// Устанавливаем количество отдаваемых строк
		// Если передан 0, то возвращаем все найденные строки
		if (isset($options['rowsperpage']) && $options['rowsperpage']>0) {
			$select -> limitPage($this->getCurrentPage(),(int)$options['rowsperpage']);
		} elseif(!isset($options['rowsperpage'])) {
			$select -> limitPage($this->getCurrentPage(),$this->getPerPage());
		}
		
		// Добавляем условие, если выборка для фронтенда
		if($this->getModule()!='control') $select -> where('visible=?','yes');
				
		return $this->_db->fetchAll($select);
		
	}
	
	
	/**
	 * Возвращает форму добавления/редактирования способа доставки
	 *
	 * @param string $section Секция xml-файла
	 * @return Phorm_Form
	 */

	public function getDeliveryForm($section = 'adddelivery') {
		
		return new Phorm_Form('forms/control/store.xml',$section);
		
	}
	
	
	/**
	 * Возвращает информацию о способе доставки
	 *
	 * @param int $deliveryid Id способа доставки
	 * @return array
	 */
	
	public function getDeliveryInfo($deliveryid) {
		
		$select = $this->_db->select()
				-> from('pw_store_delivery')
				-> where('isexist=?','yes')
				-> where('deliveryid=?',$deliveryid);
				
		// Добавляем условие, если выборка для фронтенда
		if($this->getModule()!='control') $select -> where('visible=?','yes');
				
		return $this->_db->fetchRow($select);
		
	}
	
	
	/**
	 * Сохраняет данные формы добавления/редактирования способа доставки
	 *
	 * @param Phorm_Form $form
	 * @param mixed $data  Дополнительные данные формы. Если передана строка, то принимается как deliveryid
	 * @return array | false
	 * @todo Вынести простую вставку/изменение в отдельный метод? Или вообще весь CRUD?
	 */
	
	public function saveDeliveryForm($form, $data = null) {
		
		if(!is_null($data) && is_string($data)) $data = array('deliveryid'=>$data);
		$data = array_merge($form->getValues(),(array)$data);
		
		$data = $this->getFilteredValuesByTableCols('pw_store_delivery',$data);
		
		$this->_db->beginTransaction();
		
		try {
			
			// Изменение существующей записи
			if(isset($data['deliveryid'])) {
				
				$this->_db->update('pw_store_delivery',$data,'deliveryid='.(int)$data['deliveryid']);
				
			// Вставка новой записи
			} else {
				
				$this->_db->insert('pw_store_delivery',$data);
				$data['deliveryid'] = $this->_db->lastInsertId();
				
			}
			
			$this->_db->commit();						  
			return $data;
			
		} catch (Exception $e) {
			
			$this->_db->rollBack();	
			$this->_errors[] = $e->getMessage();
			
		}
		
		return false;
		
	}
	
	
	/**
	 * Возвращает список типов клиентов
	 *
	 * @param array $options Массив опций
	 * @return array
	 * @todo Бросить добавление сортировок и постраничной выборки в модель отдельными методами или придумать иной способ избежать дублирования
	 * @todo Добавить связку с таблицей клиентов
	 */
	
	public function getClientgroupsList($options = array()) {
		
		/*$select = $this->_db->select()
				-> from(array('AA'=>'pw_store_clientgroups'), 
							new Zend_Db_Expr("SQL_CALC_FOUND_ROWS AA.*, 1 actions, 
											 (SELECT COUNT(*) FROM pw_users WHERE clientgroupid=AA.clientgroupid AND isexist='yes') clients"))
				-> where('isexist=?','yes');*/
				
		$select = $this->_db->select()
				-> from(array('AA'=>'pw_store_clientgroups'), 
							new Zend_Db_Expr("SQL_CALC_FOUND_ROWS AA.*, 1 actions"))
				-> where('isexist=?','yes');
				
		// Сортировки
		if(isset($options['sortField']) && in_array($options['sortField'],$this->getTableCols('pw_store_clientgroups'))) {
			$sortOrder = isset($options['sortOrder']) && $options['sortOrder']=='desc' ? ' DESC' : ' ASC';
			$select->order($options['sortField'].$sortOrder);
		} else {
			$select->order('clientgroupname');
		}
		
		// Устанавливаем количество отдаваемых строк
		// Если передан 0, то возвращаем все найденные строки
		if (isset($options['rowsperpage']) && $options['rowsperpage']>0) {
			$select -> limitPage($this->getCurrentPage(),(int)$options['rowsperpage']);
		} elseif(!isset($options['rowsperpage'])) {
			$select -> limitPage($this->getCurrentPage(),$this->getPerPage());
		}
		
		// Добавляем условие, если выборка для фронтенда
		if($this->getModule()!='control') $select -> where('visible=?','yes');
				
		return $this->_db->fetchAll($select);
		
	}
	
	
	/**
	 * Возвращает информацию о типе клиента
	 *
	 * @param int $clientgroupid Id типа
	 * @return array
	 */
	
	public function getClientgroupInfo($clientgroupid) {
		
		$select = $this->_db->select()
				-> from('pw_store_clientgroups')
				-> where('isexist=?','yes')
				-> where('clientgroupid=?',$clientgroupid);
				
		// Добавляем условие, если выборка для фронтенда
		if($this->getModule()!='control') $select -> where('visible=?','yes');
				
		return $this->_db->fetchRow($select);
		
	}
	
	/**
	 * Возвращает форму добавления/редактирования типа клиента
	 *
	 * @param string $section Секция xml-файла
	 * @return Phorm_Form
	 */

	public function getClientgroupForm($section = 'addclientgroup') {
		
		$form = new Phorm_Form('forms/control/store.xml',$section);
		
		if(isset($form->roleid)) {
			$user = new Phorm_User();
			$form->roleid->addMultioptions(array(0=>$this->_translate->_('Любая')) + $user->getRolesListAsPairs());
		}
		
		return $form;
		
	}
	
	
	/**
	 * Сохраняет данные формы добавления/редактирования типа клиента
	 *
	 * @param Phorm_Form $form
	 * @param mixed $data  Дополнительные данные формы. Если передана строка, то принимается как clientgroupid
	 * @return array | false
	 * @todo Вынести простую вставку/изменение в отдельный метод? Или вообще весь CRUD?
	 */
	
	public function saveClientgroupForm($form, $data = null) {
		
		if(!is_null($data) && is_string($data)) $data = array('clientgroupid'=>$data);
		$data = array_merge($form->getValues(),(array)$data);
		
		$data = $this->getFilteredValuesByTableCols('pw_store_clientgroups',$data);
		
		$this->_db->beginTransaction();
		
		try {
			
			// Изменение существующей записи
			if(isset($data['clientgroupid'])) {
				
				$this->_db->update('pw_store_clientgroups',$data,'clientgroupid='.(int)$data['clientgroupid']);
				
			// Вставка новой записи
			} else {
				
				$this->_db->insert('pw_store_clientgroups',$data);
				$data['clientgroupid'] = $this->_db->lastInsertId();
				
			}
			
			$this->_db->commit();						  
			return $data;
			
		} catch (Exception $e) {
			
			$this->_db->rollBack();	
			$this->_errors[] = $e->getMessage();
			
		}
		
		return false;
		
	}
	
	
	/**
	 * Возвращает список товарных групп
	 *
	 * @param array $options Массив опций
	 * @return array
	 */
	
	public function getItemgroupsList($options = array()) {
				
		$select = $this->_db->select()
				-> from(array('AA'=>'pw_store_itemgroups'), 
							new Zend_Db_Expr("SQL_CALC_FOUND_ROWS AA.*, 1 actions"))
				-> where('isexist=?','yes');
				
		// Сортировки
		if(isset($options['sortField']) && in_array($options['sortField'],$this->getTableCols('pw_store_itemgroups'))) {
			$sortOrder = isset($options['sortOrder']) && $options['sortOrder']=='desc' ? ' DESC' : ' ASC';
			$select->order($options['sortField'].$sortOrder);
		} else {
			$select->order('itemgroupname');
		}
		
		// Устанавливаем количество отдаваемых строк
		// Если передан 0, то возвращаем все найденные строки
		if (isset($options['rowsperpage']) && $options['rowsperpage']>0) {
			$select -> limitPage($this->getCurrentPage(),(int)$options['rowsperpage']);
		} elseif(!isset($options['rowsperpage'])) {
			$select -> limitPage($this->getCurrentPage(),$this->getPerPage());
		}
		
		// Добавляем условие, если выборка для фронтенда
		if($this->getModule()!='control') $select -> where('visible=?','yes');
				
		return $this->_db->fetchAll($select);
		
	}
	
	
	/**
	 * Возвращает информацию о товарной группе
	 *
	 * @param int $itemgroupid Id группы
	 * @return array
	 */
	
	public function getItemgroupInfo($itemgroupid) {
		
		$select = $this->_db->select()
				-> from('pw_store_itemgroups')
				-> where('isexist=?','yes')
				-> where('itemgroupid=?',$itemgroupid);
				
		// Добавляем условие, если выборка для фронтенда
		if($this->getModule()!='control') $select -> where('visible=?','yes');
				
		return $this->_db->fetchRow($select);
		
	}
	
	
	/**
	 * Возвращает форму добавления/редактирования товарной группы
	 *
	 * @param string $section Секция xml-файла
	 * @return Phorm_Form
	 */

	public function getItemgroupForm($section = 'additemgroup') {
		
		return new Phorm_Form('forms/control/store.xml',$section);
		
	}
	
	
	/**
	 * Сохраняет данные формы добавления/редактирования товарной группы
	 *
	 * @param Phorm_Form $form
	 * @param mixed $data  Дополнительные данные формы. Если передана строка, то принимается как itemgroupid
	 * @return array | false
	 * @todo Вынести простую вставку/изменение в отдельный метод? Или вообще весь CRUD?
	 */
	
	public function saveItemgroupForm($form, $data = null) {
		
		if(!is_null($data) && is_string($data)) $data = array('itemgroupid'=>$data);
		$data = array_merge($form->getValues(),(array)$data);
		
		$data = $this->getFilteredValuesByTableCols('pw_store_itemgroups',$data);
		
		$this->_db->beginTransaction();
		
		try {
			
			// Изменение существующей записи
			if(isset($data['itemgroupid'])) {
				
				$this->_db->update('pw_store_itemgroups',$data,'itemgroupid='.(int)$data['itemgroupid']);
				
			// Вставка новой записи
			} else {
				
				$this->_db->insert('pw_store_itemgroups',$data);
				$data['itemgroupid'] = $this->_db->lastInsertId();
				
			}
			
			$this->_db->commit();						  
			return $data;
			
		} catch (Exception $e) {
			
			$this->_db->rollBack();	
			$this->_errors[] = $e->getMessage();
			
		}
		
		return false;
		
	}
	
	
	/**
	 * Удаляет запись из таблиц магазина
	 *
	 * @param string $table
	 * @param int $identity
	 * @return boolean
	 */
	
	public function deleteResource($table,$identity) {
		
		$map = array(
			'itemgroups' => array('table' => 'pw_store_itemgroups', 'id' => 'itemgroupid'),
			'clientgroups' => array('table' => 'pw_store_clientgroups', 'id' => 'clientgroupid'),
			'delivery' => array('table' => 'pw_store_delivery', 'id' => 'deliveryid'),
		);
		
		return $this->_db->update($map[$table]['table'],array('isexist'=>'no'),$map[$table]['id'].'='.(int)$identity);
		
	}
	
}